package com.example.service.impl;

import com.example.jedis.JedisUtil;
import com.example.model.User;
import com.example.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.Map;

/**
 * @author : frosty0804@gmail.com
 * @version : v1.0
 * @projectName : Learn
 * @className : UserServiceImpl
 * @description : TODO(使用一句话概括这个类)
 * @date : 2020/3/26 16:13
 */
@Slf4j
@Service("UserService")
public class UserServiceImpl implements UserService {

    /**
     * 注入连接池
     */
    @Autowired
    private JedisPool jedisPool;

    @Autowired
    private JedisUtil jedisUtil;


    /**
     * TODO 字符串类型的演示
     * 需求：
     * 用户输入一个key
     * 先判断Redis中是否存在该key
     * 如果存在，则在Redis中进行查询，并返回该值
     * 如果不存在，则在MySQL数据库进行查询，并将查询到的值赋给Redis然后返回
     *
     * @param key 请求Redis的key
     * @return Redis中存在的key对应值
     */
    @Override
    public String getString(String key) {
        // 初始化jedis对象
        Jedis jedis = jedisUtil.getJedis();
        String result = null;
        try {
            // 对调用jedis进行key的判断是否存在于Redis
            if (jedis.exists(key)) {
                log.info("数据存在，查询Redis中的数据");
            } else {
                String value = "我是一个没有感情的测试数据";
                log.info("数据不存在于Redis，查询MySQL数据库：" + value);
                log.info("将MySQL查询得到的数据赋值给Redis");
                jedis.set(key, value);
            }
            result = jedis.get(key);
        } catch (Exception e) {
            log.error("jedis查询异常", e);
        } finally {
            jedisUtil.close(jedis);
        }
        return result;
    }


    /**
     * TODO hash类型的操作
     * 需求:
     * 前端传入一个用户ID
     * 根据用户传入的ID进行查询对象信息
     * 首先到Redis中查询，如果存在，则返回给页面
     * 如果不存在，则去数据库查询，将结果写入到Redis中，并返回给页面
     *
     * @param id 传入要查询的用户ID号码
     * @return 用户信息
     */
    @Override
    public User queryId(String id) {
        Jedis jedis = jedisUtil.getJedis();
        User user = new User();
        Map<String, String> map = new HashMap<>();
        try {
            String key = "user:" + id;
            if (jedis.exists(key)) {
                log.info("Redis存在数据，查询Redis");
                map = jedis.hgetAll(key);
                user.setId(map.get("id"));
                user.setName(map.get("name"));
                user.setAge(map.get("age"));
            } else {
                log.info("Redis不存在数据，查询MySQL数据库");
                user.setId(id);
                user.setName("李四");
                user.setAge("18");
                log.info("将MySQL中查询到的数据赋值到Redis数据库中");
                map.put("id", user.getId());
                map.put("name", user.getName());
                map.put("age", user.getAge());
                jedis.hmset(key, map);
            }
        } catch (Exception e) {
            log.error("查询Redis异常", e);
        } finally {
            jedisUtil.close(jedis);
        }
        return user;
    }
}
